/**
 * Map 是 ES6 中新增的数据结构，Map 类似于对象，但普通对象的 key 必须是字符串或者数字，
 * 而 Map 的 key 可以是任何数据类型...
 *
 * Symbol是由ES6规范引入的一项新特性，它的功能类似于一种标识唯一性的ID。
 */
import React from 'react';

function MapCom() {
  const map = new Map();

  // 当做普通对象使用,键值可以存放对象,函数
  map.set('name', 'ming');
  console.log(map);
  // Map(1){'name' => 'ming'}
  // 用forEach和letof进行遍历
  const s1: Symbol = Symbol('hi');
  console.log(typeof s1); // 'symbol

  const s2: Symbol = Symbol('hello');
  const s3: Symbol = Symbol('hello');
  console.log(s2 === s3); // false  Symbol具有唯一性

  // 实现相同的symbol
  const s4: Symbol = Symbol.for('hello');
  const s5: Symbol = Symbol.for('hello');
  console.log(s4 === s5); // true

  // Symbol可用于对象属性的定义和访问
  const grade = Symbol('grade');
  const obj = {
    name: 'ming',
    age: 22,
    [grade]: 50, // 引用时需要用[] 括起来
  };
  console.log({ obj });

  // Symbol类型的key是不能通过Object.keys()或者for...in来枚举的，它未被包含在对象自身的属性名集合(property names)之中。
  // 所以，利用该特性，我们可以把一些不需要对外操作和访问的属性使用Symbol来定义。
  console.log(Object.keys(obj)); // ['name','age']

  // 怎样获取这个对象里的Symbol呢
  // 1 使用Object的API
  console.log(Object.getOwnPropertySymbols(obj)); // [Symbol()]
  // 2 使用Reflect
  console.log(Reflect.ownKeys(obj)); // ['name', 'age', Symbol()]

  // 使用Symbol来替代常量
  // 使用Symbol定义类的私有属性/方法
  return <div />;
}
export default MapCom;
